package day20170419.programmer.dao.impl;

import day20170419.programmer.dao.BusinessDao;
import day20170419.programmer.dao.Company;
import day20170419.programmer.dao.Programmer;
import utils.ArrayUtil;

public class BusinessDaoImpl implements BusinessDao {
	/**
	 * 1招聘一个程序员 增加
	 * 
	 * @param company	传入公司拿到数组（相当于宠物商店）
	 * @param ps		程序员的对象
	 * @return 			返回结果
	 */
	public boolean programmerAdd(Company company, Programmer ps) {
		//判断员工是否存在，如果存在返回true，否则false
		boolean result = programmerGudge(company, ps.getName());
		if (result) {
			System.out.println("你增加的程序员已经存在，请不要重复...");
		} else {
			// 建一个变量拿来判断是否还可以加入程序员对象到数组
			int count = 0;
			// 拿到公司中的所有程序员（数组）
			Programmer[] programmers = company.getProgrammers();
			for (int index = 0; index < programmers.length; index++) {
				Programmer programmer = programmers[index];
				// 判断数组中是否还可以加入新的对象
				if (programmer == null) {
					// 代表有空的位置，拿到空的位置加入新的对象
					count = index;
					//拿到空位代表不用再去找下一个了，代表可以增加
					break;
				}
			}

			if (count < programmers.length) {
				// 把传进来的对象装进数组
				programmers[count] = ps;
				// 调用工具类
				ArrayUtil.arrayPrint(programmers);
				return true;
			} else {
				System.out.println("无法加入，已经装满...");
			}
		}
		return false;
	}
	
	/**
	 * 根据名字开除程序员
	 * @param company	传入公司拿到数组（相当于宠物商店）
	 * @param ps		删除的条件
	 * @return			返回结果
	 */
	public Programmer[] programmerDeleteByName(Company company,Programmer ps){
		//获取条件中的名字
		String name = ps.getName();
		//如果名字为null，就不需要执行下去了
		if(name == null){
			System.out.println("需要输入名字才能删除...");
			return null;
		}
		//获取公司中的程序员数组
		Programmer[] programmers = company.getProgrammers();
		//获取数组的长度
		int count = programmers.length;
		for(Programmer programmer : programmers){
			//防止空指针
			if(programmer != null){
				//拿到对象中的名字
				String oldName = programmer.getName();
				//判断条件的名字和对象的名字是否相同
				if(name.equals(oldName)){
					//新数组的长度--
					count--;
				}
			}else{
				//新数组的长度--
				count--;
			}
		}
		//定义一个新的数组
		Programmer[] newArrays = new Programmer[count];
		//第二次count为新数组的下标
		count = 0;
		for(Programmer programmer : programmers){
			//防止空指针
			if(programmer != null){
				//拿到对象中的名字
				String oldName = programmer.getName();
				//去反值
				if(!name.equals(oldName)){
					//赋值到新的数组
					newArrays[count] = programmer;
					//下标++
					count++;
				}
			}
		}
		//返回新的数组
		return newArrays;
	}
	
	/**
	 * 开除所有的男的程序员
	 * @param company	传入公司拿到数组（相当于宠物商店）
	 * @param ps		删除的条件
	 * @return			返回结果
	 */
	public Programmer[] programmerDeleteBySex(Company company,Programmer ps){
		//获取条件中的性别
		Character sex = ps.getSex();
		//如果性别为空，就不需要执行下去
		if(sex == null){
			System.out.println("需要输入员工的性别才能删除....");
			return null;
		}
		//获取公司中的程序员数组
		Programmer[] programmers = company.getProgrammers();
		//获取数组的长度
		int count = programmers.length;
		for(int index=0; index<programmers.length; index++){
			//获取数组中的程序员对象
			Programmer programmer = programmers[index];
			//防止空指针
			if(programmer != null){
				//拿到对象中的性别
				char oldSex = programmer.getSex();
				//判断性别是否相同
				if(sex == oldSex){
					//如果性别相同新数组长度--
					count--;
				}
			}else{
				//对象是null的新数组长度--
				count--;
			}
		}
		//定义一个新的数组
		Programmer[] newArrays = new Programmer[count];
		//第二次count为新数组的下标
		count = 0;
		for(int index=0; index<programmers.length; index++){
			//获取数组中的程序员对象
			Programmer programmer = programmers[index];
			//防止空指针
			if(programmer != null){
				//拿到对象中的性别
				char oldSex = programmer.getSex();
				//取反值
				if(sex != oldSex){
					//赋值到新的数组
					newArrays[count] = programmer;
					//下标++
					count++;
				}
			}
		}
		//返回新的数组
		return newArrays;
	}
	
	/**
	 * 把所有的女程序员的工资增加1000块
	 * @param company	传入公司拿到数组（相当于宠物商店）
	 * @param ps		条件
	 * @return 			返回结果
	 */
	public void programmerSalaryAdd(Company company, Programmer ps) {
		//获取条件中的性别
		Character newSex = ps.getSex();
		//如果性别为空，不用执行下去
		if(newSex == null){
			System.out.println("需要输入员工的性别...");
			return;
		}
		// 拿到程序员的数组
		Programmer[] programmers = company.getProgrammers();
		for (int index = 0; index < programmers.length; index++) {
			//获取数组中的对象
			Programmer programmer = programmers[index];
			if (programmer != null) {
				//获取性别
				char sex = programmer.getSex();
				//如果性别满足条件
				if (sex == newSex) {
					//获取到原来的工资在加1000
					Double salary = programmer.getSalary();
					programmer.setSalary(salary + 1000.00);
				}
			}
		}
		// 调用工具类
		ArrayUtil.arrayPrint(company.getProgrammers());
	}
	
	/**
	 * 查询所有工资在10000以上的程序员
	 * 
	 * @param company	传入公司拿到数组（相当于宠物商店）
	 * @param ps		条件
	 * @return 			返回结果
	 */
	public Programmer[] programmerFindSalary(Company company, Programmer ps) {
		//获取对象中的月薪
		Double salary = ps.getSalary();
		//月薪不能为null
		if(salary == null){
			System.out.println("月薪不能是空...");
			return null;
		}
		//第一次的count确定新数组的长度
		int count = 0;
		//获取公司中的数组
		Programmer[] programmers = company.getProgrammers();
		for(int index=0; index<programmers.length; index++){
			//获取数组中的对象
			Programmer programmer = programmers[index];
			//防止爆出空指针
			if(programmer != null){
				//获取到对象中的月薪
				Double oldSalary = programmer.getSalary();
				//如果这个对象的月薪大于条件
				if(oldSalary >= salary){
					//下标++，下次再赋值，如果不++，赋值到的永远的都是第一个
					count++;
				}
			}
		}
		
		//定义一个新的数组
		Programmer[] newArrays = new Programmer[count];
		//第二次的count就是新数组赋值的下标
		count = 0;
		for(int index=0; index<programmers.length; index++){
			//获取数组中的对象
			Programmer programmer = programmers[index];
			if(programmer != null){
				//获取到对象中的月薪
				Double oldSalary = programmer.getSalary();
				//如果这个对象的月薪大于条件
				if(oldSalary >= salary){
					//然后再赋值到新的数组
					newArrays[count] = programmer;
					//下标++，下次再赋值，如果不++，赋值到的永远的都是第一个
					count++;
				}
			}
		}
		//返回新的数组
		return newArrays;
	}
	
	
	/**
	 * 查询所有工资在10000以上的程序员，级别改为中级程序员
	 * 
	 * @param company	传入公司拿到数组（相当于宠物商店）
	 * @param ps		条件
	 * @return 			返回结果
	 */
	public Programmer[] programmerFindUpdateLevel(Company company, Programmer ps) {
		//获取对象中的月薪
		Double salary = ps.getSalary();
		String level = ps.getLevel();
		//月薪不能为null
		if(salary == null && level == null){
			System.out.println("两个值都不能是空...");
			return null;
		}
		//第一次的count确定新数组的长度
		int count = 0;
		//获取公司中的数组
		Programmer[] programmers = company.getProgrammers();
		for(int index=0; index<programmers.length; index++){
			//获取数组中的对象
			Programmer programmer = programmers[index];
			//防止爆出空指针
			if(programmer != null){
				//新数组的下标++
				count++;
			}
		}
		
		//定义一个新的数组
		Programmer[] newArrays = new Programmer[count];
		//第二次的count就是新数组赋值的下标
		count = 0;
		for(int index=0; index<programmers.length; index++){
			//获取数组中的对象
			Programmer programmer = programmers[index];
			if(programmer != null){
				//获取到对象中的月薪
				Double oldSalary = programmer.getSalary();
				//如果这个对象的月薪大于条件
				if(oldSalary >= salary){
					//那就把它的级别改了
					programmer.setLevel(level);
				}
				//然后再赋值到新的数组
				newArrays[count] = programmer;
				//下标++，下次再赋值，如果不++，赋值到的永远的都是第一个
				count++;
			}
		}
		//返回新的数组
		return newArrays;
	}

	/**
	 * 程序员名字判断
	 * 
	 * @param company	传入需要判断的数组
	 * @param name		需要判断的名字
	 * @return 			返回结果
	 */
	public boolean programmerGudge(Company company, String name) {
		//获取程序员数组
		Programmer[] programmers = company.getProgrammers();
		for (Programmer programmer : programmers) {
			//防止空指针
			if (programmer != null) {
				//获取对象中的名字
				String oldName = programmer.getName();
				//如果判断的名字和数组中的名字相同返回true
				if (name.equals(oldName)) {
					return true;
				}
			}
		}
		//不存在返回false
		return false;
	}
}
